var WSConnection = require('./WSConnection')

/**
 * WS 连接管道集合
 * ws 服务端用来保存 与 所有客户端连接 的集合
 */
class WSConnectionList { 
  constructor() { 
    this.clientConnList = [];
  }

  /**
   * 1.0 为客户端添加连接通道对象
   * @param serverURI 为连接对象取的Id，一般用对应服务端的 URI。（如果为auto，则为 clientObj.connection 的 remoteAddress + remotePort）
   * @param connObj 客户端与服务端连接的通道对象
   */
  add(serverURI, connObj) {
    if (this.includes(serverURI)) {
      console.log('集合中已存在conId【' + serverURI + '】');
    } else { 
      var connObj = new WSConnection(serverURI, connObj);
      this.clientConnList.push(connObj);
    }
  }

  /**
   * 2.0 根据 URI 删除对应的 WSConnection 对象
   * @param serverURI 移出指定连接
   * @returns 被删除的对象，如果没删除则返回 null
   */
  remove(serverURI) {
    if (this.includes(serverURI)) {
      var targetIndex = this.clientConnList.findIndex((wsCon, i, obj) => {
        if (wsCon.key == serverURI) {
          return true;
        }
      });
      // 删除指定下标元素，并返回这个元素
      return this.clientConnList.splice(targetIndex, 1);
    }
    return null;
  }

  /**
   * 3.0 判断ws连接集合中是否存在某个连接
   * @param conUri 连接目标的 uri
   */
  includes(conUri) { 
    return this.getWSConn(conUri) != null;
  }

  /**
   * 4.0 根据 uri 获取 对应的客户端连接对象
   * @param conUri 要获取客户端连接的uri
   * @returns wsConnection对象
   */
  getWSConn(conUri) { 
    var targetConn = null;
    for (var i = 0; i < this.clientConnList.length; i++) {
      var wsCon = this.clientConnList[i];
      if (wsCon.key === conUri) {
        targetConn = wsCon;
        break;
      }
    }
    return targetConn;
  }

  /**
   * 5.0 返回保存的连接个数
   */
  length() { 
    return this.clientConnList.length;
  }

}

module.exports = WSConnectionList;